package proxy_jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * JDK动态代理类必须实现统一的 InvocationHandler 接口
 * 此接口表示 调用处理类
 */
public class MySQLConnHandler implements InvocationHandler {

    //初始化目标对象
    private Object targetObject;

    //通过构造函数，动态的向代理类中设置代理对象
    public MySQLConnHandler(Object targetObject){
        this.targetObject = targetObject;
    }

    /**
     * 此接口中只实现唯一的一个方法 invoke(调用) 实现基本功能的基础上可以添加额外的功能
     *
     * @Param proxy 代理对象
     * @Param method 代表目标方法 实现基础功能
     * @Param args 代表目标方法中的所有参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //在执行目标方法之前执行的额外功能
        System.out.println("已经连接mysql数据库");

        //执行基础功能，执行目标方法
        //执行顺序：方法.被调用(目标对象,方法的参数)
        //InvocationHandler接口中的invoke方法和Method类中的invoke方法只是名字相同，其他没有任何联系
        Object result = method.invoke(targetObject,args);


        //在执行目标方法之后执行的额外功能
        System.out.println("已经断开mysql数据库");

        return result;
    }
}
